﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.IO;

namespace TCPSockets.ClientEvents.Args
{
    /// <summary>Параметры передачи данных</summary>
    /// <remarks>Содержит данные в виде массива символов.</remarks>
    public class DataEventArgs : EventArgs
    {
        /// <summary>Данные в виде массива символов</summary>
        private byte[] f_Data;   

        private Encoding f_DataEncoding;
                           
        protected IFormatter DataFormatter;

        public Encoding DataEncoding { get { return f_DataEncoding; } }

        /// <summary>Данные в виде массива символов</summary>
        public byte[] Data { get { return f_Data; } }

        /// <summary>
        /// Свойство, возращающее массив строк, генерируемый разделением 
        /// исходных данны, используя в качестве разделителя символ конца строки
        /// </summary>
        public string Message { get { return f_DataEncoding.GetString(f_Data); } }

        /// <summary>Конструктор из символьного массива</summary>
        /// <param name="Data">Данные</param>
        public DataEventArgs(byte[] Data, Encoding DataEncoding, IFormatter DataFormatter)
        {
            this.f_Data = Data;
            this.f_DataEncoding = DataEncoding;
            this.DataFormatter = DataFormatter;
        }

        /// <summary>Десериализация объекта из принятого двоичного сообщения</summary>
        public virtual object Deserialize()
        {
            using(MemoryStream mStream = new MemoryStream(this.f_Data))
                try
                {
                    return DataFormatter.Deserialize(mStream);
                }
                catch(SerializationException)
                {
                    // Внимание! Определить действие при неправильной десериализации объекта
                    return null;
                }
        }

        /// <summary>
        /// Перекрытый метод, возращающий данные в виде строки.
        /// Используется, как стандарт программирования для перевода 
        /// любого объекта в строковое отображение
        /// </summary>
        public override string ToString() { return this.Message; }
    }
}
